// 头文件
#include<pthread.h>

// 任务结构体
// void* 表示一个泛型参数
typedef struct Task{
    void (*function)(void* args);
    void* args;
}Task;

// 线程池结构体
typedef struct ThreadPool{

    /*任务队列的结构参数*/
    Task* taskQ;                // 任务队列
    int queueCapacity;          // 任务队列的容量
    int queueSize;              // 任务队列当前任务数
    int queueFront;             // 队列头，取任务
    int queueRear;              // 队列尾，加任务

    /*线程池的结构参数*/
    pthread_t managerID;        // 管理者线程ID
    pthread_t* threaIDs;        // 工作者线程ID数组
    int minNum;                 // 最小线程数
    int maxNum;                 // 最大线程数
    int busyNum;                // 当前忙碌的线程数
    int liveNum;                // 当前存活的线程数
    int exitNum;                // 要销毁的线程数

    /*多个线程会从任务队列取数据，所以涉及到共享数据加锁*/
    pthread_mutex_t mutexPool;  // 对线程池加锁
    pthread_mutex_t mutexBusy;  // 锁变量：busyNum，繁忙的线程数变化较大，一个任务启动/结束都会引起busyNum的改变
    pthread_cond_t notFull;     // 队列是否填满，条件变量，用于阻塞生产/消费
    pthread_cond_t notEmpty;    // 队列是否为空

    int shutdown;               // 是否销毁线程池，1则销毁
}ThreadPool;

/* 创建线程池，初始化，返回一个线程池实例*/
ThreadPool* threadPoolCreate(int min, int max, int queueSize);

/* 销毁线程池*/
int threadPoolDestory(ThreadPool* pool);

/* 给线程池添加任务*/
void threadPoolAdd(ThreadPool* pool, void(*func)(void*), void* arg);

/* 获取线程池中的工作线程（忙碌线程）的个数*/
int threadPoolBusyNum(ThreadPool* pool);

/* 获取线程池中还live的个数，live的线程不一定就是忙碌的*/
int threadPoolAliveNum(ThreadPool* pool);

/* 管理者线程函数*/
void* manager(void* args);

/* 工作者线程函数*/
void* worker(void* args);

/*线程退出函数*/
void threadExit(ThreadPool* pool);